BigQueryの利用ユーザに個別のデータセットやテーブルへのアクセス制御をしてみた(Cloud Console編)
BigQueryを利用する際、特定のデータセットやテーブルへのアクセスを利用ユーザに制限したい場合はどうすればよいでしょうか?
この記事では、BigQueryの利用ユーザに対して許可したデータセット/テーブルのみを表示させてアクセスさせるための設定を少ない権限で実現するための方法について記します。
検証の前提条件と準備
- 本検証では「事前定義ロール」を利用したアクセス制御を確認します。最低限必要な「権限」を「カスタムロール」でアクセス制御する方法については本記事で言及していません。
- Cloud Consoleを利用した検証となります。
- BigQuery上にデータセットとテーブルが事前に用意されているものとします。
- 「管理者」と「ユーザ」のIAMユーザをそれぞれ用意します。本検証において、それぞれのIAMユーザは以下を実現する役割を持つものとします。
管理者:ユーザに対してBigQueryへのアクセス権限を付与する
ユーザ:許可されたデータセットやテーブルにアクセスし、クエリなどジョブを実行する
上記役割を実現するうえで管理者に最低限必要なロールは、
- プロジェクトに対するアクセス権付与のための Project IAM管理者
roles/resourcemanager.projectIamAdmin
- BigQueryの特定のデータセットやテーブルへのアクセス権付与のための BigQuery データオーナー
roles/bigquery.dataOwner
となりますが、本検証では基本ロールである オーナー roles/owner
を付与しています。
ユーザへのロール割り当ては以降の手順で説明します。
本検証を実施するにあたり参照したドキュメント
データセットへのアクセスの制御 | BigQuery | Google Cloud
テーブルおよびビューへのアクセスの制御 | BigQuery | Google Cloud
BigQuery での IAM の概要 | Google Cloud
検証のパターンと設定内容
ユーザに対して実現したいアクセス制御の内容に関して2つの検証パターンを試します。
それぞれのパターンに対して設定するロールについても、以下の表で先に纏めました。
検証パターン | ユーザに対して実現したいアクセス制御内容 | ①プロジェクトに対するアクセス権付与のためのロール | ②特定のデータセットに対するアクセス権付与のためのロール | ③特定のテーブルに対するアクセス権付与のためのロール |
---|---|---|---|---|
パターン1 | ・許可したデータセットのみ表示させる ・許可したテーブルのみアクセスできる ・許可したテーブルに対してジョブの実行ができる |
BigQueryジョブユーザーroles/bigquery.jobUser |
BigQuery ユーザーroles/bigquery.user |
BigQuery データ閲覧者roles/bigquery.dataViewer |
パターン2 | ・許可したテーブルのみアクセスできる ・許可したテーブルに対してジョブの実行ができる ・データセットの情報にはアクセスさせない |
BigQueryジョブユーザーroles/bigquery.jobUser |
- | BigQuery データ閲覧者roles/bigquery.dataViewer |
検証パターン1
検証パターン1ではユーザに対して以下のアクセス制御を実現します。
- 許可したデータセットのみ表示させる
- 許可したテーブルのみアクセスできる
- 許可したテーブルに対してジョブの実行ができる
パターン1 ①プロジェクトに対するアクセス権付与
「管理者」アカウントにてCloud Consoleにログインします。
[IAMと管理] → [IAM] より、アクセス制御したい「ユーザ」のプリンシパルの編集ボタンをクリックします。
[ロール] に [BigQueryジョブユーザー] を割り当て、[保存] をクリックする。
パターン1 ②特定のデータセットに対するアクセス権付与
[BigQuery] → [BigQuery Studio] をクリックします。
ここでは対象プロジェクト配下のデータセットである「dataset_1」にのみアクセス権を付与し、「dataset_2」にはアクセス権を付与しないこととします。[エクスプローラ]より「dataset_1」をクリックし、[共有] → [権限] をクリックします。
[プリンシパルを追加]をクリックします。
[新しいプリンシパル]にアクセス制御したい「ユーザ」のプリンシパルを設定し、[ロール] に [BigQueryユーザー] を指定し、[保存] をクリックします。
※データセットに適用するBigQueryユーザーには以下の権限が含まれます。
- データセットのメタデータへのアクセスと読み取り
- データセット内のテーブルの一覧表示
※BigQueryユーザの最低適用対象はデータセットであり、データセット配下のテーブルには継承されません。最低適用対象がテーブルである BigQueryデータ閲覧者 といったロールをデータセットに適用すると、データセット配下の全てのテーブルに継承されるため、個別のテーブルへのアクセス制御はできなくなります。
[BigQueryユーザー] にアクセス制御したい「ユーザ」のプリンシパルが追加されていることを確認します。
パターン1 ③特定のテーブルに対するアクセス権付与
ここでは「dataset_1」配下のテーブルである「table_1」にのみアクセス権を付与し、「table_2」にはアクセス権を付与しないこととします。[エクスプローラ]より「table_1」を選択し、[共有] をクリックします。
[プリンシパルを追加]をクリックします。
[新しいプリンシパル]にアクセス制御したい「ユーザ」のプリンシパルを設定し、[ロール] に [BigQueryデータ閲覧者] を指定し、[保存] をクリックします。
※BigQueryデータ閲覧者を指定するとテーブルの表示はできますが、スキーマ編集等はできません。スキーマ編集等を許可する場合はBigQueryデータ編集者を選択します。
[BigQueryデータ閲覧者] にアクセス制御したい「ユーザ」のプリンシパルが追加されていることを確認します。
パターン1 ユーザによるアクセス確認
「ユーザ」アカウントにてCloud Consoleにログインします。
[BigQuery] → [BigQuery Studio] → [エクスプローラ] を確認します。
データセットに関しては、[BigQueryユーザー]を付与された[dataset_1]のみ表示され、アクセス権限を付与されていない[dataset_2]は表示されません。
テーブルに関しては、[BigQueryデータ閲覧者] を付与された[table_1]が表示されました。
[table_1]に対してクエリの実行もできます。
アクセス権限を付与されていない[table_2]はツリー上に表示されますが、アクセス拒否されます。
検証パターン2
検証パターンではユーザに対して以下のアクセス制御を実現します。
- 許可したテーブルのみアクセスできる
- 許可したテーブルに対してジョブの実行ができる
- データセットの情報にはアクセスさせない
パターン2 データセットからアクセス権限を削除
「管理者」アカウントにてCloud Consoleにログインします。
パターン1 が完了した状態で、対象プロジェクト配下のデータセットである「dataset_1」から「ユーザ」のアクセス権限を削除します。
[BigQueryユーザー] から対象の「ユーザ」の削除ボタンをクリックします。
ポップアップが表示されるので、[このリソースのロール BigQueryユーザーから~]を選択し、[削除]をクリックします。
パターン2 ユーザによるアクセス確認
「ユーザ」アカウントにてCloud Consoleにログインします。
[BigQuery] → [BigQuery Studio] → [エクスプローラ] を確認します。
パターン1で表示されていた「dataset_1」が表示されなくなりました。
[table_1]に対するアクセス権限は削除していないため、[table_1]のURLに直接アクセスすると、[table_1]の情報を表示することができます。
このとき、ツリー上に表示されなくなっていた[dataset_1]がツリー上に表示されましたが、[dataset_1]を選択するとアクセス拒否されることがわかります。
対象テーブルのURLをユーザに共有することが前提ではありますが、パターン1よりも厳格なアクセス制御が可能となります。
おわりに
BigQueryのデータセットやテーブルに対する具体的なアクセス制御が可能であることを検証によって明らかにしました。本記事がBigQueryでのデータ管理をより安全に行う一助となれば幸いです。